// 语法：
// axios(options)
// 参数配置对象：url, method, params与data
// 返回值为：promise对象
// axios.get(url, options)
// axios.post(url, data, options)
// axios.put(url, data, options)
// axios.delete(url, options)
// 功能：使用xhr发送ajax请求的工具函数，与axios库功能类似

/**
 * * 封装 axios
 * @param {*} param0 
 * @returns Promise
 */
export function axios({ method, url, params, data }) {
  method = method.toUpperCase();
  return new Promise((resolve, reject) => {
    //TODO 1. 创建对象
    const xhr = new XMLHttpRequest();
    //TODO 2. 初始化
    // 处理 params 对象为：a=100&b=200
    let str = ''
    for (let k in params) {
      str += `${k}=${params[k]}&`
    }
    str = str.slice(0, -1)
    xhr.open(method, url + '?' + str)
    //TODO 3. 发送，有些请求会携带请求体，所以先根据请求方法进行判断
    if (method === 'POST' || method === 'PUT' || method === 'DELETE') {
      // Contect-type mime 类型设置
      xhr.setRequestHeader('Content-type', 'application/json')
      // 设置请求体
      xhr.send(JSON.stringify(data))
    } else {
      xhr.send()
    }
    // 设置响应结果为 json 格式 
    xhr.responseType = 'json'
    //TODO 4. 处理结果
    xhr.onreadystatechange = function() {
      if (xhr.readyState === 4) {
        // 判断状态码
        if (xhr.status >= 200 && xhr.status < 300) {
          // 成功的状态
          resolve({
            status: xhr.status,
            message: xhr.statusText,
            body: xhr.response
          });
        } else {
          reject(new Error('请求失败，失败的状态码为' + xhr.status))
        }
      }
    }
  })
}

//* url: 请求地址，options：url参数
axios.get = function(url, options) {
  // 将 method 和 url 合并到 options 对象里面
  const config = Object.assign(options, { method: 'GET', url })
  return axios(config)
}

axios.post = function(url, options) {
  // 将 method 和 url 合并到 options 对象里面
  const config = Object.assign(options, { method: 'POST', url })
  return axios(config)
}

axios.put = function(url, options) {
  // 将 method 和 url 合并到 options 对象里面
  const config = Object.assign(options, { method: 'PUT', url })
  return axios(config)
}

axios.delete = function(url, options) {
  // 将 method 和 url 合并到 options 对象里面
  const config = Object.assign(options, { method: 'DELETE', url })
  return axios(config)
}